
#include "../inc/show_demo.h"
#include "../inc/show_dir_demo.h"

P_view_obj main_view()
{
    P_view_obj show_win = malloc(sizeof(view_obj));
    if(show_win == (P_view_obj)NULL) {
        perror("malloc error");
        return (P_view_obj)NULL;
    }
    // 创建主画布
    show_win->main_window = lv_obj_create(NULL);

    // 创建目录列表
    show_win->dir_list = lv_list_create(show_win->main_window);
    lv_obj_set_size(show_win->dir_list, 300, 480);

    // 创建文件窗口
    show_win->file_window = lv_obj_create(show_win->main_window);
    lv_obj_set_size(show_win->file_window, 495, 480);
    lv_obj_set_pos(show_win->file_window, 305, 0);

    // 加载主画布
    lv_scr_load(show_win->main_window);

    return show_win;
}

// 显示文件列表
bool show_file_list(char * path, P_view_obj show_win)
{
    printf("path:%s\n", path);
    // 打开要检索的目录
    DIR * dp = opendir(path);
    if(dp == (DIR *)NULL) {
        perror("opendir error");
        return false;
    }

    char base_path[256 * 2]; // 存放文件的绝对路径

    // 按钮坐标
    int btn_x = 30;
    int btn_y = 20;

    lv_obj_t * exit_btn = lv_list_add_btn(show_win->dir_list, LV_SYMBOL_CLOSE, "EXIT");
    lv_obj_set_style_bg_color(exit_btn, lv_color_hex(0xC0C0C0), LV_PART_MAIN);
    lv_obj_add_event_cb(exit_btn, exit_event_cb, LV_EVENT_CLICKED, "exit");

    // 读取目录
    while(1) {
        memset(base_path, 0, sizeof(base_path));

        struct dirent * eq = readdir(dp);
        if(eq == (struct dirent *)NULL) {
            break;
        }
        // 不忽略. 使显示图片后点击刷新文件窗口
        if(strcmp(eq->d_name, ".") == 0) {
            strcpy(base_path, path);
        } else if(strcmp(eq->d_name, "..") == 0) { // 处理返回上一级目录的逻辑

            char tmp_path[256 * 2] = "\0";
            strcpy(tmp_path, path);

            // 获取最后一个'/'
            char * last_slash = strrchr(tmp_path, '/');

            // 如果上一级目录为根目录，则返回根目录
            if(last_slash == tmp_path) {
                strcpy(base_path, SEARCH_PATH);
            } else {
                *last_slash = '\0'; // 截断绝对路径,获取上一级目录
                strcpy(base_path, tmp_path);
            }
        } else {
            // 拼接路径
            if(path[strlen(path) - 1] == '/') {
                sprintf(base_path, "%s%s", path, eq->d_name);
            } else {
                sprintf(base_path, "%s/%s", path, eq->d_name);
            }
        }

        // 如果是文件
        if(eq->d_type == DT_REG) {

            // 显示文件按钮
            show_file(show_win, eq->d_name, btn_x, btn_y, base_path);

            // 按钮坐标更新
            btn_x += 100;
            if(btn_x >= 400) {
                btn_x = 30;
                btn_y += 100;
            }
        }

        // 如果是文件夹
        if(eq->d_type == DT_DIR) {
            lv_obj_t * btn;

            // 根据不同的文件类型显示不同的图标
            if(strcmp(eq->d_name, ".") == 0) {
                
                btn = lv_list_add_btn(show_win->dir_list, LV_SYMBOL_REFRESH, "REFRESH");
                lv_obj_set_style_bg_color(btn, lv_color_hex(0xC0C0C0), LV_PART_MAIN);

            } else if(strcmp(eq->d_name, "..") == 0) {
                btn = lv_list_add_btn(show_win->dir_list, LV_SYMBOL_BACKSPACE, "UP ONE LEVEL");
                lv_obj_set_style_bg_color(btn, lv_color_hex(0xC0C0C0), LV_PART_MAIN);
            } else {
                btn = lv_list_add_btn(show_win->dir_list, LV_SYMBOL_DIRECTORY, eq->d_name);
            }

            // 申请按钮点击传参结构体堆空间
            struct btn_file_info * tmp_inf = malloc(sizeof(struct btn_file_info));
            if(tmp_inf == (struct btn_file_info *)NULL) {
                perror("malloc error");
                return false;
            }

            // 拷贝按钮对应路径
            tmp_inf->inf_heap = show_win;
            strcpy(tmp_inf->new_path, base_path);

            // 按钮点击事件
            lv_obj_add_event_cb(btn, dir_btn_pres, LV_EVENT_CLICKED, (void *)tmp_inf);
        }
    }

    // 关闭目录
    closedir(dp);
    return true;
}

// 目录按钮点击事件
void dir_btn_pres(lv_event_t * e)
{
    struct btn_file_info * tmp_inf = (struct btn_file_info *)e->user_data;

    // 清除之前list里面的旧控件
    lv_obj_clean(tmp_inf->inf_heap->dir_list);
    lv_obj_clean(tmp_inf->inf_heap->file_window);

    // 调用函数显示新的目录控件
    show_file_list(tmp_inf->new_path, tmp_inf->inf_heap);

    free(tmp_inf); // 释放结构体

    return;
}

// 创建文件按钮
bool show_file(P_view_obj inf_heap, char * btn_text, int abs_x, int abs_y, char * base_path)
{
    // 基于小窗口创建按钮
    lv_obj_t * btn = lv_btn_create(inf_heap->file_window);

    // 设置按钮大小
    lv_obj_set_size(btn, 80, 80);
    lv_obj_set_pos(btn, abs_x, abs_y);

    // 创建文本
    lv_obj_t * lab = lv_label_create(btn);

    // 设置长文本滚动以及宽度
    lv_label_set_long_mode(lab, LV_LABEL_LONG_SCROLL);
    lv_obj_set_width(lab, 80);

    // 设置文本以及居中
    lv_label_set_text(lab, btn_text);
    lv_obj_center(lab);

    // 申请按钮点击传参结构体堆空间
    struct btn_file_info * tmp_inf = malloc(sizeof(struct btn_file_info));
    if(tmp_inf == (struct btn_file_info *)NULL) {
        perror("malloc error");
        return false;
    }

    // 拷贝按钮对应路径
    tmp_inf->inf_heap = inf_heap;
    strcpy(tmp_inf->new_path, base_path);
    // 检查文件是否为PNG图片
    char * dot = strrchr(btn_text, '.');
    if(dot != NULL && strcmp(dot, ".png") == 0) {
        // 更改颜色
        lv_obj_set_style_bg_color(btn, lv_color_hex(0xFFFF00), LV_PART_MAIN);
        // 更改字体颜色
        lv_obj_set_style_text_color(btn, lv_color_make(0, 0, 0), LV_STATE_DEFAULT);
        // 添加点击事件
        lv_obj_add_event_cb(btn, file_btn_click, LV_EVENT_CLICKED, (void *)tmp_inf);
    }

    return true;
}

// 文件按钮点击事件处理函数
void file_btn_click(lv_event_t * e)
{
    struct btn_file_info * tmp_inf = (struct btn_file_info *)e->user_data;

    char * file_path = tmp_inf->new_path; // 设置文件路径

    // 拼接路径确保路径以 "S:" 开头
    if(strncmp(file_path, "S:", 2) != 0) {
        char corrected_path[256 * 2];
        sprintf(corrected_path, "S:%s", file_path);
        file_path = corrected_path;
    }

    printf("%s\n", file_path); // 检查路径

    // 清除之前显示的图片
    lv_obj_clean(tmp_inf->inf_heap->file_window);

    // 创建图像对象
    lv_obj_t * img = lv_img_create(tmp_inf->inf_heap->file_window);
    lv_img_set_src(img, file_path);
    lv_obj_align(img, LV_ALIGN_CENTER, 0, 0);

    free(tmp_inf); // 释放结构体
}

// 退出按钮事件回调函数
void exit_event_cb(lv_event_t * e)
{
    const char * btn_text = (const char *)lv_event_get_user_data(e);
    printf("按下 %s\n", btn_text);
    if(strcmp(btn_text, "exit") == 0) {
        // 获取事件目标对象的父对象
        lv_obj_t * dir_windows = lv_obj_get_parent(lv_event_get_target(e));
        printf("释放资源并回到主界面\n");
        // 释放画布资源
        lv_obj_del(dir_windows);    // 释放画布资源
        lv_anim_del(NULL, NULL);    // 停止并删除所有动画
        lv_obj_clean(lv_scr_act()); // 清空屏幕

        show_demo(); // 回到主界面
    }
}